/**
 * AI智能表格管理系统 - 主服务器
 * 作者：俞哲
 * 学校：浙江传媒学院
 * 指导老师：栗青生
 * 实验七：AI + 数据库 + Web开发综合应用
 */

const express = require('express');
const cors = require('cors');
const bodyParser = require('body-parser');
const path = require('path');
const config = require('./config/config');
const ChatController = require('./controllers/chatController');
const { initDatabase } = require('./database/init');

class AITableManagerServer {
  constructor() {
    this.app = express();
    this.chatController = new ChatController();
    this.setupMiddleware();
    this.setupRoutes();
  }

  /**
   * 设置中间件
   */
  setupMiddleware() {
    // CORS配置
    this.app.use(cors({
      origin: ['http://localhost:8087', 'http://127.0.0.1:8087', 'http://0.0.0.0:8087'],
      credentials: true
    }));

    // 解析JSON请求体
    this.app.use(bodyParser.json({ limit: '10mb' }));
    this.app.use(bodyParser.urlencoded({ extended: true, limit: '10mb' }));

    // 静态文件服务（服务前端文件）
    this.app.use(express.static(path.join(__dirname, '../frontend')));

    // 请求日志
    this.app.use((req, res, next) => {
      console.log(`${new Date().toISOString()} - ${req.method} ${req.path}`);
      next();
    });
  }

  /**
   * 设置路由
   */
  setupRoutes() {
    // API路由
    const apiRouter = express.Router();

    // 聊天相关路由
    apiRouter.post('/chat', (req, res) => this.chatController.handleChatMessage(req, res));
    apiRouter.get('/students', (req, res) => this.chatController.getAllStudents(req, res));
    apiRouter.get('/statistics', (req, res) => this.chatController.getStatistics(req, res));
    apiRouter.post('/reset', (req, res) => this.chatController.resetChat(req, res));
    apiRouter.get('/health', (req, res) => this.chatController.healthCheck(req, res));

    // 手动增删改查路由
    apiRouter.post('/students', (req, res) => this.chatController.addStudent(req, res));
    apiRouter.put('/students/:id', (req, res) => this.chatController.updateStudent(req, res));
    apiRouter.delete('/students/:id', (req, res) => this.chatController.deleteStudent(req, res));

    // 导出路由
    apiRouter.get('/export/csv', (req, res) => this.chatController.exportToCSV(req, res));

    // 挂载API路由
    this.app.use('/api', apiRouter);

    // 根路径重定向到前端页面
    this.app.get('/', (req, res) => {
      res.sendFile(path.join(__dirname, '../frontend/index.html'));
    });

    // 处理所有其他前端路由（SPA支持）
    this.app.get('*', (req, res) => {
      // 如果是API请求但路由不存在，返回404
      if (req.path.startsWith('/api/')) {
        res.status(404).json({
          success: false,
          error: 'API endpoint not found'
        });
      } else {
        // 否则返回前端主页
        res.sendFile(path.join(__dirname, '../frontend/index.html'));
      }
    });

    // 全局错误处理中间件
    this.app.use((err, req, res, next) => {
      console.error('服务器错误:', err.stack);
      res.status(500).json({
        success: false,
        error: '服务器内部错误',
        message: process.env.NODE_ENV === 'development' ? err.message : '服务器发生了错误'
      });
    });
  }

  /**
   * 初始化服务器
   */
  async initialize() {
    try {
      console.log('正在初始化AI智能表格管理系统...');

      // 初始化数据库
      console.log('初始化数据库...');
      await new Promise((resolve, reject) => {
        initDatabase();
        setTimeout(resolve, 2000); // 等待数据库初始化完成
      });

      // 初始化聊天控制器
      console.log('初始化聊天控制器...');
      await this.chatController.initialize();

      console.log('系统初始化完成');
      return true;
    } catch (error) {
      console.error('系统初始化失败:', error.message);
      throw error;
    }
  }

  /**
   * 启动服务器
   */
  async start() {
    try {
      await this.initialize();

      const server = this.app.listen(config.server.port, config.server.host, () => {
        console.log('='.repeat(60));
        console.log('🚀 AI智能表格管理系统启动成功！');
        console.log('='.repeat(60));
        console.log(`📍 服务器地址: http://localhost:${config.server.port}`);
        console.log(`📍 本地访问: http://127.0.0.1:${config.server.port}`);
        console.log(`📍 网络访问: http://0.0.0.0:${config.server.port}`);
        console.log('='.repeat(60));
        console.log('💡 功能说明：');
        console.log('   • 通过自然语言管理学生信息表');
        console.log('   • 支持增加、删除、修改、查询操作');
        console.log('   • 集成DeepSeek AI理解用户意图');
        console.log('='.repeat(60));
        console.log('📖 使用示例：');
        console.log('   "添加一个学生，姓名张三，年龄20，专业计算机"');
        console.log('   "查询所有计算机专业的学生"');
        console.log('   "删除姓名为李四的记录"');
        console.log('   "修改张三的年龄为21"');
        console.log('='.repeat(60));
        console.log('👨‍🎓 项目信息：');
        console.log('   作者：俞哲');
        console.log('   学校：浙江传媒学院');
        console.log('   指导老师：栗青生');
        console.log('   实验：AI + 数据库 + Web开发综合应用');
        console.log('='.repeat(60));
      });

      // 优雅关闭处理
      process.on('SIGTERM', () => {
        console.log('收到SIGTERM信号，正在优雅关闭服务器...');
        server.close(() => {
          console.log('服务器已关闭');
          this.chatController.dbService.close();
          process.exit(0);
        });
      });

      process.on('SIGINT', () => {
        console.log('收到SIGINT信号，正在优雅关闭服务器...');
        server.close(() => {
          console.log('服务器已关闭');
          this.chatController.dbService.close();
          process.exit(0);
        });
      });

    } catch (error) {
      console.error('启动服务器失败:', error.message);
      process.exit(1);
    }
  }
}

// 启动服务器
if (require.main === module) {
  const server = new AITableManagerServer();
  server.start().catch(error => {
    console.error('启动失败:', error.message);
    process.exit(1);
  });
}

module.exports = AITableManagerServer;